home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / net / ds3100.md / netLEInt.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  12KB  |  348 lines

  1. /*
  2.  * netLEInt.h --
  3.  *
  4.  *    External definitions for the Am7990 (LANCE) ethernet controller.
  5.  * The description of the definitions here come from AMD Am7990 LANCE
  6.  * data sheet (Publication 05698 Rev B) and the Am7990 Techincal Manual.
  7.  *
  8.  * Copyright (C) 1989 Digital Equipment Corporation.
  9.  * Permission to use, copy, modify, and distribute this software and
  10.  * its documentation for any purpose and without fee is hereby granted,
  11.  * provided that the above copyright notice appears in all copies.  
  12.  * Digital Equipment Corporation makes no representations about the
  13.  * suitability of this software for any purpose.  It is provided "as is"
  14.  * without express or implied warranty.
  15.  *
  16.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/net/ds3100.md/netLEInt.h,v 9.4 91/09/17 12:29:33 jhh Exp $ SPRITE (DECWRL)
  17.  */
  18.  
  19. #ifndef _NETLEINT
  20. #define _NETLEINT
  21.  
  22. #include <netInt.h>
  23.  
  24. /*
  25.  * Defined constants:
  26.  *
  27.  * NET_LE_CONTROL_REG_ADDR    The address of the control register for the 
  28.  *                ethernet chip.
  29.  * NET_LE_NUM_RECV_BUFFERS      The number of buffers that we have to receive
  30.  *                   packets in. Also, number of receive ring 
  31.  *                descriptors. It must be between 1 and 128 and
  32.  *                be a power of TWO.
  33.  * NET_LE_NUM_RECV_BUFFERS_LOG2    log base 2 of NET_LE_NUM_RECV_BUFFERS.
  34.  * NET_LE_NUM_XMIT_BUFFERS      The number of buffer descriptors that are used
  35.  *                   for a transmitted packet.  Also, number of xmit
  36.  *                ring descriptors. It must be between 1 and 
  37.  *                128 and    be a power of TWO.
  38.  * NET_LE_NUM_XMIT_BUFFERS_LOG2    log base 2 of NET_LE_NUM_XMIT_BUFFERS.
  39.  * NET_LE_RECV_BUFFER_SIZE      The size of each receive buffer. We make the
  40.  *                buffer big enough to hold the maximum size
  41.  *                ethernet packet + CRC check. This is 1514 +
  42.  *                4 = 1518 bytes. We round it to the nears 1/2 K
  43.  *                boundry to get 1536.
  44.  *            
  45.  * NET_LE_MIN_FIRST_BUFFER_SIZE    The smallest buffer that can be used for the
  46.  *                first element of a chain transmission.
  47.  *                If the first piece of a message is smaller than  *                this then it gets copied to other storage and
  48.  *                made the minimum size.
  49.  * NET_LE_NUM_XMIT_ELEMENTS     The number of elements to preallocate for the 
  50.  *                   retransmission queue.
  51.  */
  52.  
  53. #define NET_LE_CONTROL_REG_ADDR        0xB8000000
  54.  
  55. #define    NET_LE_NUM_RECV_BUFFERS_LOG2    4
  56. #define    NET_LE_NUM_RECV_BUFFERS        (1 << NET_LE_NUM_RECV_BUFFERS_LOG2)
  57.  
  58. #define    NET_LE_NUM_XMIT_BUFFERS_LOG2    0
  59. #define    NET_LE_NUM_XMIT_BUFFERS        (1 << NET_LE_NUM_XMIT_BUFFERS_LOG2)
  60.  
  61.  
  62. #define    NET_LE_RECV_BUFFER_SIZE        1536
  63. #define NET_LE_MIN_FIRST_BUFFER_SIZE    100
  64.  
  65. #define    NET_LE_NUM_XMIT_ELEMENTS    32
  66.  
  67. /*
  68.  * Buffer size from the chips point of view.
  69.  */
  70. #define NET_LE_DMA_BUF_SIZE        0x20000
  71. #define NET_LE_DMA_CHIP_ADDR_MASK    (NET_LE_DMA_BUF_SIZE - 1)
  72. #define NET_LE_DMA_BUFFER_ADDR        0xB9000000
  73.  
  74. /*
  75.  * Macros for converting chip to cpu and cpu to chip addresses.
  76.  */
  77. #define BUF_TO_CHIP_ADDR(addr) ((unsigned)NET_LE_DMA_BUFFER_ADDR + \
  78.             (((unsigned)addr & NET_LE_DMA_CHIP_ADDR_MASK) / 2))
  79. #define BUF_TO_ADDR(base, offset) \
  80.     ((volatile short *)((unsigned)(base) + ((offset) * 2 - (offset) % 2)))
  81.  
  82. #define    CHIP_TO_BUF_ADDR(addr) ((volatile unsigned short *) ((((unsigned)addr & NET_LE_DMA_CHIP_ADDR_MASK) << 1) | 0xB9000000))
  83.  
  84. /*
  85.  * The LANCE chip has four control and status registers that are selected by a
  86.  * register address port (RAP) register. The top 14 bits of RAP are reserved
  87.  * and read as zeros. The register accessable in the register data port (RDP)
  88.  * is selected by the value of the RAP. (page 15)
  89.  */
  90.  
  91. typedef struct NetLE_Reg {
  92.     unsigned short    dataPort;    /* RDP */
  93.     unsigned short        : 14;    /* Reserved - must be zero */
  94.     unsigned short    addrPort: 2;    /* RAP */
  95. } NetLE_Reg;
  96.  
  97. /*
  98.  * Possible RAP values. (page15)
  99.  */ 
  100.  
  101. #define    NET_LE_CSR0_ADDR    0x0
  102. #define    NET_LE_CSR1_ADDR    0x1
  103. #define    NET_LE_CSR2_ADDR    0x2
  104. #define    NET_LE_CSR3_ADDR    0x3
  105.  
  106. /*
  107.  * Control and status register defintions.
  108.  *
  109.  * CSR0 - Register 0.
  110.  * Note that CSR0 is updated by ORing the previous and present value.
  111.  * See (page 16-17) for description of these bits.
  112.  * Bits of CSR0 fall into the following groups:
  113.  * (R0) - Read only - writing does nothing.
  114.  * (RC)    - Read and clear by writing a one - Writing zero does nothing.
  115.  * (RW) - Read and Write.
  116.  * (RW1) - Read and write with one only. 
  117.  */
  118.  
  119. /*
  120.  * Error bits
  121.  * NET_LE_CSR0_ERROR = BABBLE|COLLISION_ERROR|MISSED_PACKET|MEMORY_ERROR
  122.  */
  123.  
  124. #define    NET_LE_CSR0_ERROR        0x8000    /* Error summary - R0 */
  125. #define    NET_LE_CSR0_BABBLE        0x4000    /* Transmitter babble - RC */
  126. #define    NET_LE_CSR0_COLLISION_ERROR    0x2000    /* Late collision - RC */
  127. #define    NET_LE_CSR0_MISSED_PACKET    0x1000    /* Miss a packet - RC */
  128. #define    NET_LE_CSR0_MEMORY_ERROR    0x0800    /* Memory error - RC */
  129. /*
  130.  * Interrupt bits.
  131.  * NET_LE_CSR_INTR = RECV_INTR|XMIT_INTR|INIT_DONE|ERROR
  132.  */
  133. #define    NET_LE_CSR0_RECV_INTR        0x0400     /* Receiver interrupt - RC */
  134. #define    NET_LE_CSR0_XMIT_INTR        0x0200    /* Trasmit interrupt - RC */
  135. #define    NET_LE_CSR0_INIT_DONE        0x0100    /* Initialization done - RC */
  136. #define    NET_LE_CSR0_INTR        0x0080    /* Interrupt Summary - R0 */
  137. /*
  138.  * Enable bits.
  139.  */
  140. #define    NET_LE_CSR0_INTR_ENABLE        0x0040    /* Interrupt enable - RW */
  141. #define    NET_LE_CSR0_RECV_ON        0x0020    /* Receiver on - R0 */
  142. #define    NET_LE_CSR0_XMIT_ON        0x0010    /* Transmitter on - R0 */
  143. #define    NET_LE_CSR0_XMIT_DEMAND        0x0008    /* Sent now flag. - RW1 */
  144. #define    NET_LE_CSR0_STOP        0x0004    /* Stop and reset - RW1 */
  145. #define    NET_LE_CSR0_START        0x0002    /* (Re)Start after stop - RW1*/
  146. #define    NET_LE_CSR0_INIT        0x0001    /* Initialize - RW1 */
  147.  
  148. /*
  149.  * Control and status register 1 (CSR1) (page 18)
  150.  * CSR1 is the low order 16 bits of the address of the Initialization block.
  151.  * Note that the LSB must be zero.
  152.  */
  153.  
  154. /*
  155.  * Control and status register (CSR2) (page 18)
  156.  * CSR2 is the high order 16 bits of address of the Initialization block.
  157.  * Note that the top 8 bits are reserved and must be zero.
  158.  */
  159.  
  160. /*
  161.  * Control and status register (CSR3) (page 18)
  162.  * CSR3 defines the Bus Master interface.
  163.  */
  164. #define    NET_LE_CSR3_BYTE_SWAP        0x0004    /* Byte swap for us. - RW */
  165. #define    NET_LE_CSR3_ALE_CONTROL        0x0002    /* Signals active low - RW */
  166. #define    NET_LE_CSR3_BYTE_CONTROL    0x0001    /* Byte control - RW */
  167.  
  168. /*
  169.  * LE Initialization block.
  170.  */
  171. #define    NET_LE_INIT_MODE    0x0
  172. #define NET_LE_INIT_ETHER_ADDR    0x2
  173. #define NET_LE_INIT_MULTI_MASK    0x8
  174. #define NET_LE_INIT_RECV_LOW    0x10
  175. #define NET_LE_INIT_RECV_HIGH    0x12
  176. #define NET_LE_INIT_RECV_LEN    0x13
  177. #define NET_LE_INIT_XMIT_LOW    0x14
  178. #define NET_LE_INIT_XMIT_HIGH    0x16
  179. #define NET_LE_INIT_XMIT_LEN    0x17
  180.  
  181. #define NET_LE_INIT_SIZE        0x18
  182.  
  183. /*
  184.  * LE Net Recv messages descriptors
  185.  */
  186. #define NET_LE_RECV_BUF_ADDR_LOW    0x0
  187. #define NET_LE_RECV_STATUS        0x2
  188. #define NET_LE_RECV_BUF_SIZE        0x4
  189. #define NET_LE_RECV_PACKET_SIZE        0x6
  190. #define NET_LE_RECV_DESC_SIZE        8
  191.  
  192. /*
  193.  * Bits in the status.
  194.  */
  195. #define NET_LE_RECV_CHIP_OWNED        0x8000
  196. #define NET_LE_RECV_ERROR        0x4000
  197. #define NET_LE_RECV_FRAMING_ERROR    0x2000
  198. #define NET_LE_RECV_OVER_FLOW_ERROR    0x1000
  199. #define NET_LE_RECV_CRC_ERROR        0x0800
  200. #define NET_LE_RECV_BUFFER_ERROR    0x0400
  201. #define NET_LE_RECV_START_OF_PACKET    0x0200
  202. #define NET_LE_RECV_END_OF_PACKET    0x0100
  203. #define NET_LE_RECV_BUF_ADDR_HIGH    0x00FF
  204.  
  205. /*
  206.  * LE Net Xmit messages descriptors (page 23-23)
  207.  */
  208. #define NET_LE_XMIT_BUF_ADDR_LOW    0x0
  209. #define NET_LE_XMIT_STATUS1        0x2
  210. #define NET_LE_XMIT_BUF_SIZE        0x4
  211. #define NET_LE_XMIT_STATUS2        0x6
  212. #define NET_LE_XMIT_DESC_SIZE        8
  213.  
  214. /*
  215.  * The status bits in the first status short.
  216.  */
  217. #define    NET_LE_XMIT_CHIP_OWNED        0x8000
  218. #define NET_LE_XMIT_ERROR        0x4000
  219. #define NET_LE_XMIT_RETRIES        0x1000
  220. #define NET_LE_XMIT_ONE_RETRY        0x0800
  221. #define NET_LE_XMIT_DEFERRED        0x0400
  222. #define NET_LE_XMIT_START_OF_PACKET    0x0200
  223. #define NET_LE_XMIT_END_OF_PACKET    0x0100
  224. #define NET_LE_XMIT_BUF_ADDR_HIGH    0x00FF
  225.  
  226. /*
  227.  * Bits in the second status short.
  228.  */
  229. #define NET_LE_XMIT_BUFFER_ERROR    0x8000
  230. #define NET_LE_XMIT_UNDER_FLOW_ERROR    0x4000
  231. #define NET_LE_XMIT_LATE_COLLISION    0x1000
  232. #define NET_LE_XMIT_LOST_CARRIER    0x0800
  233. #define NET_LE_XMIT_RETRY_ERROR        0x0400
  234. #define NET_LE_XMIT_TDR_COUNTER        0x03FF
  235.  
  236. /*
  237.  * Structure to hold all state information associated with one of these
  238.  * chips.
  239.  */
  240. typedef struct {
  241.     volatile unsigned short *regAddrPortPtr; /* Which register to read or 
  242.                           *    write. */
  243.     volatile unsigned short *regDataPortPtr; /* The value to write or read 
  244.                           * from. */
  245.     Address        initBlockPtr;    /* Chip initialization block. */
  246.     /*
  247.      * Pointers for ring of receive buffers. 
  248.      */
  249.     Address        recvDescFirstPtr;/* Ring of receive desc start.*/
  250.     Address        recvDescNextPtr; /* Next receive desc to be filled. */
  251.     Address        recvDescLastPtr; /* Ring of receive descriptors end. */
  252.     /*
  253.      * Pointers for ring of transmit buffers. 
  254.      */
  255.     Address        xmitDescFirstPtr;/* Ring of xmit descriptors start.*/
  256.     Address        xmitDescNextPtr; /* Next xmit desc to be filled. */
  257.     Address        xmitDescLastPtr; /* Ring of xmit descriptors end. */
  258.  
  259.     List_Links        xmitListHdr;    /* List of packets to be transmited. */
  260.     List_Links        *xmitList;    /* Pointer to the front of the list of
  261.                        packets to be transmited. */
  262.     List_Links        xmitFreeListHdr; /* List of unused packets. */
  263.     List_Links          *xmitFreeList;    /* Pointer to a list of unused 
  264.                        transmission queue elements. */
  265.     Boolean        transmitting;    /* Set if are currently transmitting a
  266.                        packet. */
  267.     Boolean        running;    /* Is the chip currently active. */
  268.     Net_EtherAddress    etherAddressBackward;    /* The ethernet address in 
  269.                          * reverse byte order. */
  270.     Net_EtherAddress    etherAddress;    /* The ethernet address */
  271.     Address        recvDataBuffer[NET_LE_NUM_RECV_BUFFERS]; /* Receive
  272.                             * data buffers. */
  273.     Boolean        recvMemInitialized;    /* Flag for initializing
  274.                          * kernel memory. */
  275.     Boolean        recvMemAllocated;    /* Flag for allocating
  276.                          * memory for ring buffers. */
  277.     Net_ScatterGather     *curScatGathPtr;  /* Pointer to scatter gather element 
  278.                        * for current packet being sent. */
  279.     char                loopBackBuffer[NET_ETHER_MAX_BYTES]; /* Buffer for the
  280.                           * loopback address. */
  281.     char        *firstDataBuffer; /* Buffer used to ensure that
  282.                        * first element is of a minimum
  283.                        * size. */
  284.     Boolean        xmitMemInitialized; /* Flag to note if xmit memory
  285.                          * has been initialized. */
  286.     Boolean        xmitMemAllocated; /* Flag to note if xmit memory
  287.                        * has been allocated. */
  288.     Net_Interface    *interPtr;    /* Pointer back to network interface. */
  289.     Address        xmitBufPtr;    /* Buffer for a transmitted packet. */    
  290.     Address        recvBufPtr;    /* Buffer for a received packet. */    
  291.     Net_EtherStats    stats;        /* Performance statistics. */
  292. } NetLEState;
  293.  
  294. /*
  295.  * The state of all of the interfaces. 
  296.  */
  297.   
  298. extern    NetLEState    netLEState;
  299.  
  300. extern    NetLEState    netLEDebugState;
  301.  
  302. /*
  303.  * General routines.
  304.  */
  305.  
  306. extern    ReturnStatus    NetLEInit _ARGS_((Net_Interface *interPtr));
  307. extern    void        NetLEReset _ARGS_((Net_Interface *interPtr));
  308. extern    void        NetLERestart _ARGS_((Net_Interface *interPtr));
  309. extern    void        NetLEIntr _ARGS_((Net_Interface *interPtr, 
  310.                     Boolean polling));
  311. extern ReturnStatus     NetLEIOControl _ARGS_((Net_Interface *interPtr, 
  312.                 Fs_IOCParam *ioctlPtr, Fs_IOReply *replyPtr));
  313. extern    Address        NetLEMemAlloc _ARGS_((unsigned int numBytes, 
  314.                     Boolean wordAlign));
  315.  
  316. extern    ReturnStatus    NetLEGetStats _ARGS_((Net_Interface *interPtr, 
  317.                 Net_Stats *statPtr));
  318.  
  319. /*
  320.  * Routines for transmitting.
  321.  */
  322.  
  323. extern    void        NetLEXmitInit _ARGS_((NetLEState *statePtr));
  324. extern    ReturnStatus    NetLEXmitDone _ARGS_((NetLEState *statePtr));
  325. extern    ReturnStatus    NetLEOutput _ARGS_((Net_Interface *interPtr,
  326.                 Net_EtherHdr *etherHdrPtr, 
  327.                 Net_ScatterGather *scatterGatherPtr,
  328.                 int scatterGatherLength, Boolean rpc,
  329.                 ReturnStatus *statusPtr));
  330. extern    void        NetLEXmitDrop _ARGS_((NetLEState *statePtr));
  331. extern    void    NetLEXmitRestart _ARGS_((NetLEState *statePtr));
  332.  
  333. /*
  334.  * Routines for the receive unit.
  335.  */
  336.  
  337. extern    void        NetLERecvInit _ARGS_((NetLEState *statePtr));
  338. extern    ReturnStatus    NetLERecvProcess _ARGS_((Boolean dropPackets,
  339.                 NetLEState *statePtr));
  340.  
  341.  
  342.  
  343. #endif _NETLEINT
  344.  
  345.  
  346.  
  347.  
  348.